package demo.security.example.web.config;

import demo.security.example.web.filter.TimeFilter;
import demo.security.example.web.interceptor.TimeInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * WebConfig
 * 像xml一样配置相应bean
 * @author lidj
 * @date 2018-01-09
 */
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{//这个是为了将timeInterceptor注册到springmvc拦截器中

    @Autowired
    private TimeInterceptor timeInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(timeInterceptor);
    }

    @Bean
    public FilterRegistrationBean timeFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        TimeFilter timeFilter = new TimeFilter();
        filterRegistrationBean.setFilter(timeFilter);
        List<String> urls = new ArrayList<>();
        //这里可以指定filter拦截的路径
        urls.add("/*");
        filterRegistrationBean.setUrlPatterns(urls);
        return filterRegistrationBean;
    }

/**
 * 但是 使用filter有个缺陷啊
 * 只能获取request和response参数的一些值
 * 但是实际上是由哪个控制器的哪个方法来处理的，我们事不知道的
 * 因为filter实在javaee规范中定义的 而javaee规范显然不知道spring做了啥
 *
 * 所以，在spring框架下，想获得更多信息而且适用性更强的话（因为filter只在servlet请求前后）
 * 建议使用拦截器(由spring框架本省提供)
 *
 * 但是拦截器拿不到被调用的参数的值（别妄想用拦截器中的handler拿到参数） 我勒个去
 *
 * 如果要拿到更全面的信息，比如请求参数
 *
 * 我们要用aspect--切片  即AOP
 *
 * 但是aspect 拿不到请求信息
 *
 * 那么 filter interceptor aspect执行顺序 很简单了
 * filter -> interceptor -> aspect ->interceptor->filter
 *
 *
 * 当然出异常的话，会多一步
 *  那就是在controller抛出异常 会有aspect 首先得到，没有处理的话，接下来如果有相应的advice 则由advice处理
 *  如果没有，则由interceptor处理，如果interceptor没有处理的话会由filter处理 如果filter不处理，那就直接抛到页面
 */
}
